<?php

require_once("lib/db/mysqlDatabase.php");
require_once("EncuentroTorneo.php");
require_once("EquipoTorneo.php");

class Torneo {
	var $id;
	var $nombre;
	var $fechaInscripcion;
	var $fechaInicio;
	var $fechaFin;
	var $estado; 
	var $tipo;
	var $equipos;
	var $continente;
	var $inscripciones;
	var $encuentroRaiz;
	var $totalEquipos;
	
	function __construct($fecha=NULL, $tipo=NULL){
		$this->fecha = $fecha;
		$this->tipo = $tipo;
	}
	
	function getFromDB($id){
		$query = new mysqlQuery("tournament", "", "torneo", "*", "`id`='".$id."'", "", "");
		$query->execute();
		$row = $query->next();
		if($row){
			$this->id = $row["id"];
			$this->nombre = $row["nombre"];
			$this->fechaInscripcion = $row["fecha_inscripcion"];
			$this->fechaInciio = $row["fecha_inicio"];
			$this->fechaFin = $row["fecha_fin"];
			$this->tipo = $row["tipo"];
			$this->estado = $row["estado"];
			$this->equipos = $row["equipos"];
			$this->continente = $row["continente"];
			$this->inscripciones = $row["inscripciones"];
			$this->totalEquipos = $row["total_equipos"];
			
			$this->encuentroRaiz = new EncuentroTorneo(0, $this, 0);
			$this->encuentroRaiz->getFromDB();
		}
	}
	
	function getLastFromDB(){
		$query = new mysqlQuery("tournament", "", "torneo", "*", "", "id", "DESC");
		$query->execute();
		$row = $query->next();
		if($row){
			$this->id = $row["id"];
			$this->nombre = $row["nombre"];
			$this->fechaInscripcion = $row["fecha_inscripcion"];
			$this->fechaInciio = $row["fecha_inicio"];
			$this->fechaFin = $row["fecha_fin"];
			$this->tipo = $row["tipo"];
			$this->estado = $row["estado"];
			$this->equipos = $row["equipos"];
			$this->continente = $row["continente"];
			$this->inscripciones = $row["inscripciones"];
			$this->totalEquipos = $row["total_equipos"];
			
			$this->encuentroRaiz = new EncuentroTorneo(0, $this, 0);
			$this->encuentroRaiz->getFromDB();
		}
	}
	
	function insert(){
		$data = array(NULL, $this->fecha, $this->tipo);
		$query = new mysqlInsert("", "torneo", $data);
		$query->execute();
		$this->id = $query->getInsertedId();
	}
	
	function activarTorneo($totalEquipos){
		$fields = array("estado", "total_equipos");
		$values = array("2", $totalEquipos);
		$update = new mysqlUpdate("tournament", "", "torneo", $fields, $values, "`id`='".$this->id."'");
		$update->execute();
	}
	
	function generarEncuentros(){		
		if($this->estado == 1){		
			$equipos = NULL;
			$jugadores = array();
			$equiposTorneo = array();
			
			$q = "SELECT * FROM 
									((SELECT j.id as id, 
										j.jugador1 as j1, 
										j.jugador2 as j2, 
										j.equipo as e, 
										j.torneo as torneo, 
										j.fecha as fecha, 
										j.estado as estado,
										u1.karma as karma 
									FROM jugadores as j, usuarios as u1 
									WHERE j.jugador1 = u1.id AND j.jugador2 = 0 AND j.torneo = '".$this->id."' AND estado = '1') 
									UNION 
									(SELECT j.id as id, 
										j.jugador1 as j1, 
										j.jugador2 as j2, 
										j.equipo as e, 
										j.torneo as torneo, 
										j.fecha as fecha, 
										j.estado as estado,
										u1.karma + u2.karma as karma 
									FROM jugadores as j, usuarios as u1, usuarios as u2 
									WHERE j.jugador1 = u1.id AND j.jugador2 = u2.id AND j.torneo =  '".$this->id."' AND estado = '1')) AS Q order by karma DESC, id ASC 
									";
			//$query = new mysqlQuery("tournament", "", "jugadores", "*", "`torneo`='".$this->id."' AND `estado`='1'", "id", "ASC");
			$query = new mysqlQuery("tournament", $q, "", "", "", "", "");
			$query->execute();
			$slots = obtenerSlots($query->getCount());
			//if($this->tipo == 5)
			//	$slots = obtenerSlots(floor($query->getCount() / 2));
			$inscripcionesValidas = $slots[1];
			$n = 0;
			
			
			/* Se genera el array con los equipos aleatorios en caso de que sea necesario */
			if($this->tipo == 1 || $this->tipo == 2 || $this->tipo == 5){
				$equipos = $this->obtenerEquiposAleatorios($inscripcionesValidas);
			}
			
			/* Cada grupo de jugadores en una posicion del array */
			while(($row = $query->next()) && $n < $inscripcionesValidas){
				$jugadores[$n] = new EquipoTorneo();
				$jugadores[$n]->id = $row["id"];
				$jugadores[$n]->jugador1 = $row["j1"];
				$jugadores[$n]->jugador2 = $row["j2"];
				$jugadores[$n]->equipo = $row["e"];
				$jugadores[$n]->torneo = $this->id;
				$n ++;
			}
						
			echo "JUGADORES\n";
			var_dump($jugadores);
			
			if($this->tipo == 1 || $this->tipo == 2){
				foreach($jugadores as $jugador){
					$jugador->equipo = array_pop($equipos);
					$jugador->update();
					array_push($equiposTorneo, $jugador);
				}
			}else if($this->tipo == 5){
				shuffle($jugadores);
				echo "\nJUGADORES ALEATORIOS\n";
				var_dump($jugadores);
				$inscripcionesValidas /= 2;
				for($i = 0; $i < $inscripcionesValidas; $i ++){									
					$jugador1 = array_pop($jugadores);
					$jugador2 = array_pop($jugadores);
					echo "\nJUGADOR1";
					var_dump($jugador1);
					echo "\nJUGADOR2";
					var_dump($jugador2);
					$jugador1->equipo = array_pop($equipos);
					$jugador1->jugador2 = $jugador2->jugador1;
					$jugador1->update();
					$jugador2->delete();
					array_push($equiposTorneo, $jugador1);
				}
			}else{
				$equiposTorneo = $jugadores;
			}
			shuffle($equiposTorneo);
			
			$nivelArbol = log($inscripcionesValidas, 2) - 1;		
			$encuentroRaiz = new EncuentroTorneo(0, $this, 0);	
			$encuentroRaiz->insertar();	
			$encuentroRaiz->crearHijos($nivelArbol);
			
			/* Poblar las hojas con partidos */
			for($i = 0; $i < $inscripcionesValidas; $i+=2){
				$e1 = array_pop($equiposTorneo);
				$e2 = array_pop($equiposTorneo);
				//$e1->enviarNotificacion($this->nombre, $this->id);
				//$e2->enviarNotificacion($this->nombre, $this->id);	
				$encuentroRaiz->encontrarHijoSinPartidos($e1, $e2);
			}
			$this->activarTorneo($inscripcionesValidas);
		}
	}
	
	function obtenerEquiposAleatorios($total){		
			$where = "";
			$repeticiones = 1;
			switch($this->equipos){
				case 0: $where = ""; break;
				case 1: $where = "`liga` != '6'"; break;
				case 2: $where = "`liga` = '6'"; break;
				case 3: $where = "`liga` = '1'"; break;
				case 4: $where = "`liga` = '2'"; break;
				case 5: $where = "`liga` = '8'"; break;
				case 6: $where = "`liga` = '4'"; break;
				case 7: $where = "`liga` = '3'"; break;
				case 8: $where = "`liga` = '7'"; break;
				case 9: $where = "`liga` != '6' AND `liga` != '5'"; break;
				case 10: $where = "`liga` = '5'"; break;
			}
			$query = new mysqlQuery("tournament", "", "equipos", "*", $where, "", "");
			$query->execute();
			$totalEquipos = $query->getCount();
			if($totalEquipos < $total){
				$repeticiones = ceil($total / $totalEquipos) + 1;
			}
			
			$equipos = array();
			for($i = 0; $i < $repeticiones; $i ++){
				$query->execute();
				while($row  = $query->next()){
					array_push($equipos, $row["id"]);
				}
			}
			shuffle($equipos);
			$ret = array();
			for($i = 0; $i < $total; $i++){
				array_push($ret, array_pop($equipos));
			}
			return $ret;
	}
	
	function mostrarTorneo(){		
		$sizes = array(
			"2" => array("X", "Y"), 
			"4" => array(600, 220),
			"8" => array(1000, 370),
			"16" => array(1300, 555),
			"32" => array(1880, 800),
			"64" => array(2050, 1700),
			"128" => array(2600, 3400),
			"256" => array(3200, 5900), 
			"512" => array(4000, 4000),
			"1024" => array("X", "Y"),
		);
				
		$path = "cache/tournament-".$this->id.".dat";
		if(!file_exists($path) || (strtoupper($_GET["regenerate"]) == "TRUE" && isAdmin())){
			$this->getFromDB($this->id);
			$this->generarCacheElementosTorneo($sizes);			
		}else{
			$modificationTime = time() - filemtime($path);			
			if(CACHE_TIME < $modificationTime){
				$this->getFromDB($this->id);
				$this->generarCacheElementosTorneo($sizes);
			}
		}
		
		if(isAdmin() && $_GET["tracecache"]){
			$modificationTime = time() - filemtime($path);
			echo '<div id="status">Generated: '.tournamentGenerationTime($modificationTime).'. Regeneration in: 
				'.tournamentGenerationTime(CACHE_TIME - $modificationTime).'.</div>';
		}
		
		if(file_exists($path)){
			$file = fopen($path, "r");
			$content = fread($file, filesize($path));
			echo $content;
		}else{
			header("Location: index.php");
		}		
				  	
    	return $sizes[$this->totalEquipos][0];
	}
	
	function generarCacheElementosTorneo($sizes){
		if($this->encuentroRaiz){
			ini_set('memory_limit', '512M');
			
			$width = $sizes[$this->totalEquipos][0];
			$height = $sizes[$this->totalEquipos][1];
			$imagePath = "img/tournament-image-".$this->totalEquipos.".gif";
			$im = FALSE;
			
			$html = '<div id="enfrentamientos">';
			
			if(!file_exists($imagePath)){			
				$im = imagecreatetruecolor($width, $height+400);
				$color = imagecolorallocate($im, 200, 200, 200);
				imagefill($im, 0, 0, imagecolorallocate($im, 51,51,51));
			}
			
			$html .= $this->encuentroRaiz->mostrarEnfrentamientoTest(0,0,0, $im, $color, $width, $height);
			$html .= '<img src="img/tournament-image-'.$this->totalEquipos.'.gif"/>';
			$html .= '</div>';
		
			if(!file_exists($imagePath)){
				imagegif($im, $imagePath);
			}
						
			$file = fopen("cache/tournament-".$this->id.".dat", "w");
			fwrite($file, $html);
			fclose($file);
		}else{
			echo "<p>No existen datos</p>";
		}
	}
}

?>